package com.easysoft.commons.utils;

import java.util.regex.Pattern;

/**
 * 校验器：利用正则表达式校验邮箱、手机号等
 * 
 * @author try
 */
public class PatternUtils {

	private PatternUtils() {
	}

	/**
	 * 验证用户名
	 */
	public static final String REGEX_USERNAME = "^[a-zA-Z]\\w{5,17}$";

	/**
	 * 校验密码强度:密码的强度必须是包含大小写字母和数字的组合，不能使用特殊字符，长度在6-10之间。
	 */
	public static final String REGEX_PASSWORD = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{6,10}$";

	/**
	 * 验证手机号
	 */
	public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(17[0-9])|(18[0-9]))\\d{8}$";

	/**
	 * 验证邮箱
	 */
	public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";

	/**
	 * 校验中文:字符串仅能是中文。
	 */
	public static final String REGEX_CHINESE = "^[\u4e00-\u9fa5],{0,}$";

	/**
	 * 验证18位身份证
	 */
	public static final String REGEX_ID_CARD = "^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$";

	/**
	 * 验证URL
	 */
	public static final String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";

	/**
	 * 校验IP-v4地址
	 */
	public static final String REGEX_IPV4_ADDR = "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";

	/**
	 * 校验IP-v6地址
	 */
	public static final String REGEX_IPV6_ADDR = "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))";

	/**
	 * 校验日期:“yyyy-mm-dd“ 格式的日期校验，已考虑平闰年。
	 */
	public static final String REGEX_DATE = "^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$";

	/**
	 * 校验车牌号
	 */
	public static final String REGEX_CAR_LICENSE = "^[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$";

	/** 校验发动机号 */
	private static final String REGEX_CAR_ENGINE = "^[a-zA-Z0-9]{6,32}$";

	/**
	 * 校验用户名
	 * 
	 * @param username
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isUsername(String username) {
		if (StringUtils.isNullOrBlank(username)) {
			return false;
		}

		return Pattern.matches(REGEX_USERNAME, username);
	}

	/**
	 * 校验密码
	 * 
	 * @param password
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isPassword(String password) {
		if (StringUtils.isNullOrBlank(password)) {
			return false;
		}

		return Pattern.matches(REGEX_PASSWORD, password);
	}

	/**
	 * 验证手机号码 <br>
	 * 130、131、132、133、134、135、136、137、138、139 <br>
	 * 150、151、152、153、 xxx、155、156、157、158、159 <br>
     * 170、171、172、173、 174、175、176、177、178、179 <br>
     * 180、181、182、183、 184、185、186、187、188、189 <br>
	 * 
	 * @param mobile
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isMobile(String mobile) {
		if (StringUtils.isNullOrBlank(mobile)) {
			return false;
		}

		return Pattern.matches(REGEX_MOBILE, mobile);
	}

	/**
	 * 校验邮箱
	 * 
	 * @param email
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isEmail(String email) {
		if (StringUtils.isNullOrBlank(email)) {
			return false;
		}

		return Pattern.matches(REGEX_EMAIL, email);
	}

	/**
	 * 校验汉字
	 * 
	 * @param chinese
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isChinese(String chinese) {
		if (StringUtils.isNullOrBlank(chinese)) {
			return false;
		}

		return Pattern.matches(REGEX_CHINESE, chinese);
	}

	/**
	 * 校验身份证
	 * 
	 * @param idCard
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isIDCard(String idCard) {
		if (StringUtils.isNullOrBlank(idCard)) {
			return false;
		}

		return Pattern.matches(REGEX_ID_CARD, idCard);
	}

	/**
	 * 校验URL
	 * 
	 * @param url
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isUrl(String url) {
		if (StringUtils.isNullOrBlank(url)) {
			return false;
		}

		return Pattern.matches(REGEX_URL, url);
	}

	/**
	 * 校验IP-v4地址
	 * 
	 * @param ipAddr
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isIPv4Addr(String ipAddr) {
		if (StringUtils.isNullOrBlank(ipAddr)) {
			return false;
		}

		return Pattern.matches(REGEX_IPV4_ADDR, ipAddr);
	}

	/**
	 * 校验车牌号：第一位以汉字开始，第二为A-Z大写字母，后5几位为字母或数字
	 * 
	 * @param license
	 *            车牌号
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isCarLicense(String license) {
		if (StringUtils.isNullOrBlank(license)) {
			return false;
		}

		return Pattern.matches(REGEX_CAR_LICENSE, license);
	}

	/**
	 * 校验发动机号：6-32长度，字母和数字
	 * 
	 * @param engine
	 *            发动机号
	 * @return 校验通过返回true，否则返回false
	 */
	public static boolean isCarEngine(String engine) {
		if (StringUtils.isNullOrBlank(engine)) {
			return false;
		}

		return Pattern.matches(REGEX_CAR_ENGINE, engine);
	}

	public static void main(String[] args) {
		System.out.println(PatternUtils.isCarLicense(null));
	}
}